home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: delta / whiteline CD Series - delta.iso / dl_serie / updates / 078 / arj_996 / mode_4.s < prev    next >
Text File  |  1995-11-25  |  4KB  |  120 lines

  1. ;
  2. ; ARJ mode4 decode function
  3. ; Size optimized
  4. ; (c) 1993 Mr Ni! (the Great) of the TOS-crew
  5. ;
  6. ; void decode_f(ulong origsize /* size of depacked data */,
  7. ;               char* depack_space, char* packed_data)
  8. ; CALL:
  9. ; D0 = origsize (long) (size of depacked data)
  10. ; A0 = ptr to depack space
  11. ; A1 = ptr to packed data
  12. ;
  13. ; Register usage:
  14. ; d0: temporary register
  15. ; d1: temporary register
  16. ; d2: temporary register, pointer offset
  17. ; d3: bytes to do counter
  18. ; d4: #bytes to copy
  19. ; d5: klad
  20. ; d6: bitbuf,subbitbuf
  21. ; d7: #bits in subbitbuf
  22. ; a0: depack space
  23. ; a1: rbuf_current
  24. ; a2: source adres for byte copy
  25. ; a3: temporary register
  26. ; a4: not used
  27. ; a5: not used
  28. ; a6: not used
  29. decode_f:
  30.      movem.l D3-D7/A2-A3,-(SP) ; save registers
  31.      move.l  D0,D3           ; origsize
  32.      moveq   #0,D7           ; bitcount = 0
  33.      move.w  A1,D0           ; for checking rbuf_current
  34.      btst    D7,D0           ; does readbuf_current point to an even address?
  35.      beq.s   .cont           ; yes
  36.      move.b  (A1)+,D6        ; pop eight  bits
  37.      moveq   #8,D7           ; 8 bits in subbitbuf
  38.      lsl.w   #8,D6           ;
  39. .cont:
  40.      moveq   #$10,D4         ; push 16 (8) bits into bitbuf
  41.      sub.w   D7,D4           ; subtract still available bits from  d5
  42.      lsl.l   D7,D6           ;
  43.      move.w  (A1)+,D6        ; word in subbitbuf
  44.      lsl.l   D4,D6           ; fill bitbuf
  45. .count_loop:                 ; main depack loop
  46.      move.l  D6,D1           ; evaluate most significant bit bitbuf
  47.      bmi.s   .start_sld      ; =1 -> sliding dictionary
  48.      moveq   #9,D0           ; pop bits from bitbuf for literal
  49.      bsr.s   .getbits        ;
  50.      move.b  D2,(A0)+        ; push byte in buffer
  51. .eval_loop:
  52.      subq.l  #1,D3           ;
  53.      bne.s   .count_loop     ;
  54.      movem.l (SP)+,D3-D7/A2-A3 ;
  55.      rts                     ;
  56.  
  57. .start_sld:                  ; start decode len
  58.      movea.w #8,A3           ;
  59.      moveq   #0,D2           ; max power
  60.      bsr.s   .get_them       ;
  61.      add.w   D2,D5           ; length
  62.      move.w  D5,D4           ;
  63.      move.l  D6,D1           ; bitbuf
  64.      subq.w  #3,A3           ; move.w  #5,a3
  65.      moveq   #9,D2           ; minimum getbits
  66.      bsr.s   .get_them       ;
  67.      ror.w   #7,D5           ;
  68.      addq.w  #1,D4           ; increment len by one
  69.      add.w   D5,D2           ; calc pointer
  70.      neg.w   D2              ; pointer offset negatief
  71.      lea     -1(A0,D2.w),A2  ; pointer in dictionary
  72.      sub.l   D4,D3           ; sub 'bytes to copy' from 'bytes to do' (d4 is 1 too less!)
  73. .copy_loop_0:
  74.      move.b  (A2)+,(A0)+     ;
  75.      dbra    D4,.copy_loop_0 ;
  76.      bra.s   .eval_loop      ;
  77.  
  78. .get_them:
  79.      moveq   #1,D0           ; minimum fillbits
  80.      moveq   #0,D5           ; value
  81. .loop:
  82.      add.l   D1,D1           ; shift bit outside
  83.      bcc.s   .einde          ; if '1' end decode
  84.      addx.w  D5,D5           ; value *2+1
  85.      addq.w  #1,D0           ; extra fill
  86.      addq.w  #1,D2           ; extra get
  87.      cmp.w   A3,D0           ; max bits
  88.      bne.s   .loop           ; nog mal
  89.      subq.w  #1,D0           ; 1 bit less to trash
  90. .einde:                      ;
  91.      bsr.s   .fillbits       ; trash bits
  92.      move.w  D2,D0           ; bits to get
  93.      bsr.s   .getbits        ; get bits
  94.      rts                     ;
  95.  
  96. .getbits:
  97.      move.l  D6,D2           ;
  98.      clr.w   D2              ;
  99.      rol.l   D0,D2           ;
  100. .fillbits:
  101.      sub.b   D0,D7           ; decrease subbitbuf count
  102.      bcs.s   .fill_subbitbuf ; not enough
  103.      rol.l   D0,D6           ; bits to pop from buffer
  104.      rts                     ;
  105.  
  106. .fill_subbitbuf:             ;
  107.      move.b  D7,D1           ;
  108.      add.b   D0,D1           ;
  109.      sub.b   D1,D0           ;
  110.      rol.l   D1,D6           ;
  111.      move.w  (A1)+,D6        ;
  112.      rol.l   D0,D6           ;
  113.      add.b   #16,D7          ; bits in subbitbuf
  114.      rts
  115.  
  116. ;d0,d1,d2,d3,d4,d5,d6,d7,a0,a1,a2,a3,a4,a5,a6,a7,sp
  117. ********************************************************************************
  118.  
  119.      END
  120.